#pragma once

#include <iostream>
#include <fstream>
#include <string>

class Util
{
public:
    static bool ReadFileContent(const std::string &filename, std::string *out)
    {
        // 默认是以文本方式读取文件的. 图片是二进制的.
        //  std::ifstream in(filename);
        //  if (!in.is_open())
        //      return false;
        //  std::string line;
        //  while (std::getline(in, line))
        //  {
        //      *out += line;
        //  }
        //  in.close();
        //  return true;
        //以二进制
        int filesize = FileSize(filename);
        if (filesize > 0)
        {
            std::ifstream in(filename);
            if (!in.is_open())
                return false;
            out->resize(filesize); // std::string::resize 用于调整字符串的大小
            in.read((char *)(out->c_str()), filesize);
            in.close();
        }
        else
        {
            return false;
        }
        return true;
    }

    static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep /*\r\n*/)
    {
        auto pos = bigstr.find(sep);
        if (pos == std::string::npos)
            return false;

        *out = bigstr.substr(0, pos);
        bigstr.erase(0, pos + sep.size());
        return true;
    }
    static int FileSize(const std::string &filename)
    {
        std::ifstream in(filename, std::ios::binary); // 以二进制的方式打开
        if (!in.is_open())
        {
            return -1;
        }
        // 也可以用stat获取含有文件大小的结构体

        in.seekg(0, in.end);       // 将首位移动到末尾
        int filesize = in.tellg(); // 返回偏移位置，即文件大小
        in.seekg(0, in.beg);       // 恢复到开始
        in.close();
        return filesize;
    }
};